Invalidate old source in gdk_window_move_region
authorAlexander Larsson <alexl@redhat.com>
Thu, 13 Aug 2009 11:32:17 +0000 (13:32 +0200)
committerAlexander Larsson <alexl@redhat.com>
Thu, 13 Aug 2009 12:46:01 +0000 (14:46 +0200)
When we copy the region we need to also re-expose the areas of
the copied region that was not also in the destination.
And, we need to do this invalidation after the move, as the
move also moves any invalid area.

gdk/gdkwindow.c

index 04d8010061c0cb4760ea7b9f5322d79addc9f288..211d672434ac0e9ed20f90e063ea79bb3a78a268 100644 (file)
@@ -6960,17 +6960,19 @@ gdk_window_move_region (GdkWindow       *window,
   gdk_region_offset (copy_area, dx, dy);
   gdk_region_intersect (copy_area, private->clip_region_with_children);
 
-  /* invalidate parts of the region not covered by the copy */
+  /* Invalidate parts of the region (source and dest) not covered
+     by the copy */
   nocopy_area = gdk_region_copy (region);
   gdk_region_offset (nocopy_area, dx, dy);
+  gdk_region_union (nocopy_area, region);
   gdk_region_subtract (nocopy_area, copy_area);
-  gdk_window_invalidate_region (window, nocopy_area, FALSE);
-  gdk_region_destroy (nocopy_area);
 
   /* convert from window coords to impl */
   gdk_region_offset (copy_area, private->abs_x, private->abs_y);
-
   move_region_on_impl (impl_window, copy_area, dx, dy); /* Takes ownership of copy_area */
+
+  gdk_window_invalidate_region (window, nocopy_area, FALSE);
+  gdk_region_destroy (nocopy_area);
 }
 
 /**